home *** CD-ROM | disk | FTP | other *** search
-
- Eine EXEC Funktion mit Speicherauslagerung
- Version 3.1, Freigegeben 91-08-20
-
- Public Domain Software von
- Thomas Wagner
- Ferrari electronic GmbH
-
-
- Dieses Archiv enthält die Quellen für eine 'EXEC'-Funktion die den
- Aufruf externer Programme erlaubt, wobei der Programmspeicher
- optional auf EMS, XMS, oder Datei ausgelagert wird. Bei Auslagerung
- des Speichers werden nur noch wenige K des Hauptspeichers belegt
- während das externe Programm ausgeführt wird. Der Code/Daten-Bereich
- beträgt etwa 1k, der benötigte Speicherplatz ist abhängig von der
- Speicherfragmentierung, sowie besonders von der Größe des
- Umgebungsvariablenblocks. Üblicherweise werden zwischen 2K und 7K
- belegt.
-
- Die Routinen sind kompatibel mit
- Turbo C (Versionen 1.x, 2.x, sowie C++ 1.0)
- Borland C++ (Version 2.0),
- Microsoft C (Versionen 5.1 und 6.0),
- Watcom C (Version 8.0),
- Turbo Pascal (Versionen 4.x und 5.x, Version 6.x nicht getestet).
-
- EMS (LIM 3.0 und spätere Versionen) oder XMS werden benutzt sofern
- ausreichend Platz zur Verfügung steht. Wenn nicht, wird eine
- temporäre Plattendatei angelegt. Diese Datei wird in dem durch die
- Umgebungsvariablen TEMP= oder TMP= gegebenen Pfad angelegt. Ist kein
- solcher Pfad angegeben, wird der aktuelle Pfad benutzt.
-
- Aufruf und Parameterversorgung sind in der Datei "exec.h" (C) bzw.
- "exec.pas" (Pascal) detailliert dokumentiert.
-
- Das allgemeine Format ist
-
- retcode = do_exec (Name des auszuführenden Programms,
- Programm-Parameter und Redirection String,
- Spawn-Optionen,
- Benötigter Speicher (0xffff lagert stets aus, 0 nie),
- Umgebungsvariablen-Zeiger/Flag)
-
- zum Beispiel:
-
- rc = do_exec ("cl", "-c -Od exec.c >&errout", USE_ALL, 0xffff, NULL);
-
- oder, für Pascal:
-
- rc := do_exec ('tpc', '/$D+ exec >&errout', USE_ALL, $ffff, false);
-
- Redirection für Standard Input, Standard Output, und Standard Error
- wird optional behandelt indem der Parameter-String nach den folgenden
- Kombinationen durchsucht wird:
-
- stdin: <file
- stdout: >file oder >>file zum Anfügen
- stderr: >&file oder >&>file zum Anfügen
-
- Redirection wird standardmäßig unterstützt. Um sie auszuschalten,
- müssen Sie die Definitionen sowohl in spawn.asm als auch in
- exec.c/exec.pas ändern.
-
- Wenn das auszuführende Kommando eine Batch-Datei ist, wird
- automatisch der Kommando-Prozessor aufgerufen. Der Kommandoprozessor
- wird auch aufgerufen wenn das Kommando leer ist. Dabei wird die
- COMSPEC-Umgebungsvariable benutzt um den Kommandoprozessor zu finden,
- zusätzliche Parameter in der COMSPEC-Zeile werden in die
- Kommandoparameter eingefügt.
-
- Zum Beispiel:
-
- Es sei COMSPEC=C:\DOS\COMMAND.COM /E:960
- PATH=C:\DOS;C:\CMD
- Datei B.BAT existiert in C:\CMD
- do_exec wird aufgerufen mit ('b', 'eins zwei >out', ...)
-
- Dann ist das aufgerufene Kommando
- C:\DOS\COMMAND.COM
- mit dem Parameter-String
- /E:720 /C C:\CMD\B.BAT eins zwei
- und Standard Output wird umgeleitet auf die Datei 'out'.
-
-
-
- INHALT
- ======
-
- Dieses Archiv enthält die folgenden Dateien:
-
- LIESMICH.DOC Diese Datei
- README.DOC Englische Version dieser Datei
-
- GETLANG.EXE Ein Hilfsprogramm zur Extraktion einer ein-
- sprachigen Version aus der zweisprachigen
- Quelle.
- Alle C- und Assembler-Quellen (die Pascal-Quellen
- leider nur teilweise) sind sowohl in Deutsch als
- auch in Englisch dokumentiert, was die Quellen
- schwer lesbar macht. Für bessere Lesbarkeit
- können Sie mit GETLANG eine der Sprachen
- eliminieren.
-
- Benutzung: GETLANG Sprache Compiler <Eingabe >Ausgabe
- wobei Sprache 'E' für Englisch oder 'D' für Deutsch
- Compiler 'C' für C Dateien, 'A' für Assembler,
- 'P' für Pascal.
-
- Beispiele: GETLANG d a <spawn.asm >spawnd.asm
- GETLANG d c <extest.c >extestd.c
-
- DEUTSCH.BAT Batch-File zur Ausführung von GETLANG für alle
- Quelldateien, deutsche Version
- ENGLISH.BAT Batch-File zur Ausführung von GETLANG für alle
- Quelldateien, englische Version
-
- SPAWN.ASM Die Hauptfunktion für exec.
-
- Diese Datei ist für die C und Pascal Versionen gleich.
- Für Benutzung mit Turbo Pascal muß mit dem Turbo-Assembler
- assembliert werden. Die C Version kann mit TASM (geben Sie
- /JMASM51 an) oder MASM 5.1 übersetzt werden.
-
- Assemblieren mit:
- tasm /DPASCAL spawn,spawnp; Für Turbo Pascal, near calls
- tasm /DPASCAL /DFARCALL spawn,spawnp;
- Für Turbo Pascal, far calls
- ?asm spawn; Für C (Default small model)
- ?asm /DMODL=xxx spawn; For C (model 'xxx')
- Beispiel:
- masm /DMODL=large spawn; Large model C
- tasm /DMODL=medium /JMASM51 spawn; Medium model C
-
- SPAWNP.OBJ SPAWN assembliert für Pascal, near calls
- SPAWNCS.OBJ SPAWN assembliert für C (small model)
- SPAWNCL.OBJ SPAWN assembliert für C (large model)
-
- Die C Dateien wurden mit dem /MX-Schalter übersetzt um
- Groß-/Kleinschreibung beim Linken zu berücksichtigen.
-
- Hinweis für Turbo Pascal: Sie können die "near call" Version
- von SPAWN auch dann nutzen wenn Sie mit "force far calls"
- kompilieren, indem Sie die "external"-Definitionen von
- do_spawn und prep_swap in Datei exec.pas in {$F-} und {$F+}
- einschließen.
- Um Konfusion bei der Verwendung mehrerer Compiler zu
- vermeiden, wurde das Pascal-Object "spawnp.obj" benannt.
-
- CHECKPAT.ASM Hilfsfunktion zur Prüfung und Auflösung eines Pfades
-
- Diese Datei ist für die C und Pascal Versionen gleich.
- Für Benutzung mit Turbo Pascal muß mit dem Turbo-Assembler
- assembliert werden. Die C Version kann mit TASM (geben Sie
- /JMASM51 an) oder MASM 5.1 übersetzt werden.
-
- Assemblieren mit:
- tasm /DPASCAL checkpat,checkpap; Für Turbo Pascal, near calls
- tasm /DPASCAL /DFARCALL checkpat,checkpap;
- Für Turbo Pascal, far calls
- ?asm checkpat; Für C (Default small model)
- ?asm /DMODL=xxx checkpat; Für C (model 'xxx')
- Beispiel:
- masm /DMODL=large checkpat; Large model C
- tasm /DMODL=medium /JMASM51 checkpat; Medium model C
-
- CHECKPAP.OBJ CHECKPAT assembliert für Pascal, far calls
- CHECKPCS.OBJ CHECKPAT assembliert für C (small model)
- CHECKPCL.OBJ CHECKPAT assembliert für C (large model)
- CHECKPAT.PAS Einbindungs-Unit für checkpat (Nur Pascal)
-
- Die C Dateien wurden mit dem /MX-Schalter übersetzt um
- Groß-/Kleinschreibung beim Linken zu berücksichtigen.
- Die Pascal-Version muß mit dem FARCALL-Schalter assembliert
- werden wenn Sie sie mit der Einbindungs-Unit CHECKPAT.PAS
- zusammen benutzen. Zumindest Turbo Pascal Version 5.5
- verwendet offenbar stets einen Far Call wenn eine externe
- Routine im Interface-Teil einer Unit definiert wird.
-
- EXEC.PAS Interface Routinen und Dokumentation für Turbo Pascal
- EXEC.C Interface Routinen für C
- EXEC.H Interface Definitionen und Dokumentation für C
- COMPAT.H MS-C/TC Kompatibilitäts-Definitionen für C
-
- Diese Dateien bereiten die Parameter für die Hauptfunktion
- vor und bearbeiten die Datei-Suche und Umgebungsvariablen.
-
- EXTEST.C C Test-Programm für EXEC
- EXTEST.PAS Turbo Pascal Test-Programm für EXEC
-
- Das EXTEST Programm testet die Funktionalität der do_exec
- Funktion. Es erwartet die Eingabe eines DOS-Kommandos und,
- durch Komma getrennt, seiner Parameter. Die Eingabe einer
- Leerzeile startet COMMAND.COM ohne Parameter.
-
- MAKEPAS Make-Datei für Turbo Pascal (Borland Make)
- MAKETC Make-Datei für Borland C++ (Borland Make)
- MAKEMS Make-Datei für Microsoft C (MS NMAKE)
-
-
- Die Turbo Pascal Version von EXEC.PAS enthält Ersatzfunktionen für
- die Umgebungsvariablen-Zugriffsfunktionen 'envcount', 'envstr', und
- 'getenv', sowie eine zusätzliche Funktion 'putenv'. Diese Funktion
- erlaubt Ihnen, zur Umgebung des gerufenen Programms Strings
- hinzuzufügen. Die Definition ist
-
- procedure putenv (envvar: string);
-
- wobei 'envstr' einen String der Form 'ENVVAR=wert' enthält. Das '='
- ist notwendig. Um einen Umgebungsvariablenstring zu löschen geben Sie
- 'ENVVAR=' an. Bitte nutzen Sie nur die Funktionen aus der EXEC Unit,
- mischen Sie sie nicht mit Aufrufen der Funktionen der DOS Unit.
-
-
- SUPPORT
- =======
-
- Diese Software ist "Public Domain", das heißt es gibt keinerlei
- Einschränkungen bezüglich ihrer Nutzung, ob privat oder in
- kommerziellen Produkten. Es ist weder eine Registrierungsgebühr zu
- zahlen, noch sind zur Nutzung irgendwelche Lizenzen erforderlich.
-
- Dies heißt allerdings auch, daß der Autor zu keiner Leistung
- gegenüber dem Nutzer verpflichtet ist. Jegliche Ansprüche auf
- Schadenersatz bei Fehlfunktionen sind ausgeschlossen. Sie haben die
- Quellen, bitte prüfen Sie sie vor Nutzung.
-
- Ich möchte auch um Verständnis bitten, daß ich nicht in der Lage bin,
- kostenlose Programmierberatung zu erteilen, Spezialversionen für
- exotische Compiler zu erstellen, oder neue Versionen dieses Programms
- kostenlos zu versenden.
-
- Fehlermeldungen, Verbesserungsvorschläge und ähnliches senden Sie
- bitte an meine Firmen-Adresse:
-
- Ferrari electronic GmbH
- Thomas Wagner
- Beusselstrasse 27
- D-1000 Berlin 21
-
- Telephon: (030) 396 50 21 (nur im äußersten Notfall)
- Fax: (030) 396 80 20
-
- BIX: twagner
- UUCP: oeschi@netmbx.UUCP (attn: Thomas Wagner)
-
- Ein eingeschränkter Support ist über BIX, das Teleconferencing System
- von McGraw-Hill, möglich. Falls Sie Fragen oder Fehlermeldungen
- haben, senden sie BIXmail an 'twagner'. Details über BIX finden Sie
- in der Englischsprachigen Version dieser Dokumentation.
-
-
-
- EINSCHRÄNKUNGEN
- ===============
-
- Der "keine Rückkehr"-Modus von do_exec ist nur der Vollständigkeit
- halber verfügbar. Er hat einige Nachteile gegenüber den
- Standard-Funktionen der Compiler-Bibliotheken. Insbesondere werden
- offene Dateien nicht abgeschlossen, und durch die Laufzeitbibliothek
- belegte Interrupt-Vektoren werden nicht auf den DOS-Standardwert
- zurückgesetzt. Wenn möglich, benutzen Sie für diesen Modus die
- Standardfunktionen.
-
- Das Assembler-Modul "spawn" darf nicht das erste Modul beim Linken
- sein. Fügen Sie es in eine Bibliothek ein, oder geben Sie spawn.obj
- als eine der letzten zu linkenden Dateien an. Das spawn-Modul
- überschreibt etwa 1k am Anfang des Programmspeichers. Dieser Speicher
- wird zwar gesichert, er darf aber nicht Teile des Moduls selbst
- enthalten, da der Programmcode dabei zerstört würde. Die
- do_exec-Funktion überprüft diese Bedingung, und kehrt mit einem
- entsprechenden Fehlercode zurück falls der Code in Gefahr wäre.
-
- Bei Aufruf von do_exec dürfen keine Interrupt-Handler installiert
- sein. Dies schließt Handler für Control-C und Critical Errors ein.
- Sofern Sie Interrupts bearbeiten wollen während Ihr Programm
- ausgelagert ist, müssen Sie das spawn-Modul modifizieren, sodaß die
- Handler in den residenten Teil übernommen werden.
-
- Offene Dateien bleiben während der do_exec-Funktion geöffnet. Dies
- reduziert die Zahl der möglichen offenen Dateien für das
- Kind-Programm. Die Umgebungsvariable "C_FILE_INFO", die von einigen
- C-Compilern bei Aufruf der Standard-Funktionen für spawn erzeugt
- wird, wird nicht unterstützt. Wenn NO_INHERIT in spawn.asm gesetzt
- ist (Standard), werden alle offenen Dateien außer den ersten fünf
- Standard-Dateien vor dem Kindprozess "versteckt" und damit nicht
- vererbt. Dies erlaubt dem Kindprozess, mehr Dateien zu öffnen, wobei
- allerdings das Systemweite Limit (FILES= in config.sys) hoch genug
- sein muß um alle offenen Dateien zu unterstützen.
-
- Interne Kommandos (CD, DIR usw.) werden nicht automatisch bearbeitet.
- Sie können diese ausführen indem Sie den Kommandointerpreter laden
- (durch Übergabe eines leeren Strings für das auszuführende Programm).
- Zum Beispiel:
-
- (C) retcode = do_exec ("dir", "*.*", USE_ALL, 0xffff, environ);
- if (retcode == RC_NOFILE)
- retcode = do_exec ("", "/c dir *.*", USE_ALL, 0xffff, environ);
-
- (P) retcode := do_exec ('dir', '*.*', USE_ALL, $ffff, true);
- if (retcode = RC_NOFILE)
- retcode := do_exec ('', '/c dir *.*', USE_ALL, $ffff, true);
-
-
-
- HINWEISE
- ========
-
- Die Funktion sollte mit DOS bis herunter zu Version 2.11 kompatibel
- sein. Getestet wurde jedoch nur unter DOS 3.3, DOS 4.0, DOS 5.0, und
- DR-DOS 5.0.
-
- Kompatibilität zu Compiler-Versionen wurde nur getestet mit Borland
- C++ 2.0, Microsoft C 6.0a, und Turbo Pascal 5.5. Auf andere Compiler
- habe ich leider keinen Zugriff.
-
- Wird ein Kommando aufgerufen das resident bleibt (TSR), zum Beispiel
- PRINT oder Sidekick, ist eine Rückkehr in das rufende Programm nicht
- möglich. Das Programm wird beendet, belegter Speicher in EMS/XMS wird
- freigegeben, eine Auslagerungsdatei wird gelöscht.
-
- Wenn der Programmspeicher aus mehreren DOS-Speicherblöcken besteht,
- benutzt die Auslagerungsfunktion undokumentierte DOS-Interna.
- Insbesondere werden Speicherkontrollblöcke direkt modifiziert. Dies
- kann theoretisch zu Inkompatibilitäten mit späteren DOS-Versionen,
- oder mit DOS-Clones oder Emulatoren führen. Im praktischen Betrieb
- wurden bisher noch keine Probleme mit irgendwelchen DOS-Versionen,
- einschließlich DOS 5.0 und der DR-DOS Versionen, festgestellt.
-
- Wenn NO_INHERIT in spawn.asm gesetzt ist, werden einige
- undokumentierte Felder im PSP benutzt und modifiziert. Auch dies
- sollte mit allen DOS-Versionen und Clones funktionieren. Sollten Sie
- jedoch Probleme befürchten, können Sie NO_INHERIT auf 0 setzen.
-
-
- Änderungsgeschichte
- ===================
-
- Änderungen von Version 3.0a auf 3.1:
-
- Neu sind vor allem die automatische Behandlung von .BAT-Dateien und
- die Unterstützung der I/O-Dateiumleitung. Die Suchreihenfolge für
- Kommandos entspricht jetzt exakt der DOS-Reihenfolge, bis auf die
- Bearbeitung interner Kommandos (es gibt keinen sicheren Weg für die
- Erkennung, ob ein Kommando intern oder extern ist). Dateiumleitung
- ist optional. Das Interface zu do_exec hat sich nicht geändert,
- do_spawn benötigt drei neue Parameter wenn Redirection eingeschaltet
- ist.
-
- Eine Routine (checkpat.asm) die einen Pfad prüft und auflöst sowie in
- seine Bestandteile aufteilt wurde hinzugefügt. Diese Routine führt
- einige Prüfungen des Pfades und des Dateinamens durch und behandelt
- Critical Errors (ungültiges Laufwerk, Laufwerk nicht bereit) ohne
- Benutzereingriff. Die Routine wird zur Bearbeitung des
- Programm-Dateinamens, des Kommandoprozessor-Dateinamens und des
- temporären Dateipfades verwendet. Die Routine ist unabhängig von den
- anderen EXEC/SPAWN-Funktionen, sie kann daher auch in anderen
- Applikationen nützlich sein.
-
- Einige neue Fehlercodes erlauben eine bessere Analyse von
- Fehlerursachen.
-
- Der Pfad der temporären Datei ist jetzt stets ein vollständiger Pfad.
- Ein Wechsel von Laufwerk oder Pfad während der Auslagerung kann daher
- jetzt nicht mehr zum Verlust der Auslagerungsdatei führen.
-
- Die Prüfung auf Existenz einer Datei wurde in checkpat.asm verlagert,
- und von der 'find first'-Funktion auf 'get file attributes'
- umgestellt. Dies scheint geringfügig schneller und vermeidet
- Compiler-Abhängigkeiten.
-
- Das Programm GETLANG wurde korrigiert, die Hilfs-Meldungen werden
- jetzt auf stderr ausgegeben.
-
-
- Änderungen von Version 3.0 auf 3.0a:
-
- Ein kleiner Fehler in EXEC.C wurde korrigiert: ein '<' fehlte in
- einem deutschen Kommentar, sodaß bei GETLANG E ein großer Teil der
- Datei verschluckt wurde.
-
- Ein Problem (Fehler? Feature?) bei der Turbo C/Borland C "stat"
- Funktion, die für Directories stets "read-only" liefern, verhinderte
- die Benutzung der TEMP Directory beim Auslagern. Die Schreib-
- Erlaubnis wird jetzt nicht mehr geprüft.
-
- Die Präallozierung der Auslagerungsdatei, die mit Version 3.0
- eingeführt wurde um sicherzustellen daß das Laufwerk den kompletten
- Speicher fassen kann, führte zu starken Verzögerungen wenn die
- Auslagerungsdatei auf einem Novell-Netzwerk Laufwerk lag. Um dieses
- Problem zu umgehen wurden zwei neue Flags für den "method" Parameter
- eingeführt:
-
- NO_PREALLOC - Nie Präallozieren
- CHECK_NET - Nicht Präallozieren wenn Datei auf Netzwerk
-
- Wenn die Datei nicht präalloziert wird, wird das Laufwerk nicht auf
- ausreichenden Platz geprüft. Die Alternative, der "get disk free
- space" Aufruf, dauert im allgemeinen noch wesentlich länger als ein
- Präallozieren. Dies ist allerdings kein großes Problem, die
- Auslagerung liefert lediglich den Fehlercode 0x502 wenn der
- Speicherplatz nicht ausreicht.
-
-
- Änderungen für Version 3.0:
-
- Dies ist die erste Version mit Deutscher Dokumentation. Falls Sie mit
- früheren Versionen gearbeitet haben, können Sie die Änderungen in der
- Englischen Beschreibung nachlesen - denn dann können Sie doch
- Englisch, oder? :)
-